package com.ttl.sbgl.loginback.controller;

import com.ttl.sbgl.loginback.entity.QrToken;
import com.ttl.sbgl.loginback.entity.User;
import com.ttl.sbgl.loginback.service.QrLoginService;
import com.ttl.sbgl.loginback.utils.QrCodeUtil;
import com.ttl.sbgl.loginback.utils.Result;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.HashMap;
import java.util.Map;
import java.lang.StringBuilder;

//二维码登陆接口
@RestController
@RequestMapping("/qr")
public class QrLoginController {

  @Resource
  private QrLoginService qrLoginService;

  /**
   * 生成二维码登录token和二维码图片
   * 
   * @return 包含token和二维码图片的响应
   */
  @RequestMapping(value = "/generate", method = { RequestMethod.GET, RequestMethod.POST })
  public Result<Map<String, String>> generateQrCode(@RequestParam(value = "baseUrl", required = false) String baseUrl) {
    try {
      // 生成二维码token
      QrToken qrToken = qrLoginService.generateQrToken();

      // 生成二维码内容（包含token的URL）

      // // 使用ngrok地址，确保手机可以访问
      // String ngrokUrl = "https://fb2d-124-126-96-214.ngrok-free.app";
      // String qrContent = ngrokUrl + "/qr/confirm?token=" + qrToken.getToken();

      String pcIpAddress = "192.168.170.12"; // 修改为PC端实际IP地址
      String qrContent = "https://" + pcIpAddress + ":9090/qr/confirm?token=" + qrToken.getToken();
      // 生成二维码图片
      String qrCodeImage = QrCodeUtil.generateQrCodeBase64(qrContent);

      // 返回结果
      Map<String, String> result = new HashMap<>();
      result.put("token", qrToken.getToken());
      result.put("qrCodeImage", qrCodeImage);
      result.put("qrContent", qrContent);

      return Result.success(result, "二维码生成成功");
    } catch (Exception e) {
      e.printStackTrace();
      return Result.error("2001", "二维码生成失败");
    }
  }

  /**
   * 检查二维码状态
   * 
   * @param token 二维码token
   * @return 二维码状态信息
   */
  @GetMapping("/status/{token}")
  public Result<QrToken> checkQrStatus(@PathVariable String token) {
    try {
      QrToken qrToken = qrLoginService.checkQrTokenStatus(token);
      if (qrToken == null) {
        return Result.error("2002", "二维码不存在");
      }

      if ("EXPIRED".equals(qrToken.getStatus())) {
        return Result.error("2003", "二维码已过期");
      }

      if ("CONFIRMED".equals(qrToken.getStatus())) {
        return Result.success(qrToken, "二维码已确认");
      }

      return Result.success(qrToken, "等待扫码确认"); // 状态是pending
    } catch (Exception e) {
      e.printStackTrace();
      return Result.error("2004", "检查二维码状态失败");
    }
  }

  /**
   * 确认二维码登录（移动端调用）
   * 
   * @param requestBody 包含token、userName、password的JSON对象
   * @return 确认结果
   */
  @PostMapping("/confirm")
  public Result<String> confirmQrLogin(@RequestBody Map<String, String> requestBody) {
    try {
      String token = requestBody.get("token");
      String userName = requestBody.get("userName");
      String password = requestBody.get("password");

      if (token == null || userName == null || password == null) {
        return Result.error("2009", "参数不完整");
      }

      boolean success = qrLoginService.confirmQrLogin(token, userName, password);
      if (success) {
        return Result.success("确认成功", "登录确认成功");
      } else {
        return Result.error("2005", "用户名或密码错误，或二维码已过期");
      }
    } catch (Exception e) {
      e.printStackTrace();
      return Result.error("2006", "确认登录失败");
    }
  }

  /**
   * 获取二维码登录的用户信息（PC端调用）
   * 
   * @param token 二维码token
   * @return 用户信息
   */
  @GetMapping("/user/{token}")
  public Result<User> getUserByToken(@PathVariable String token) {
    try {
      User user = qrLoginService.getUserByToken(token);
      if (user == null) {
        return Result.error("2007", "获取用户信息失败");
      }
      return Result.success(user, "获取用户信息成功");
    } catch (Exception e) {
      e.printStackTrace();
      return Result.error("2008", "获取用户信息失败");
    }
  }

  /**
   * 直接确认二维码登录（基于当前登录状态）
   * 
   * @param requestBody 包含token的JSON对象
   * @return 确认结果
   */
  @PostMapping("/confirm-direct")
  public Result<String> confirmQrLoginDirect(@RequestBody Map<String, String> requestBody) {
    try {
      String token = requestBody.get("token");
      String userName = requestBody.get("userName"); // 从当前登录状态获取

      if (token == null || userName == null) {
        return Result.error("2009", "参数不完整");
      }

      boolean success = qrLoginService.confirmQrLoginDirect(token, userName);
      if (success) {
        return Result.success("确认成功", "登录确认成功");
      } else {
        return Result.error("2005", "二维码已过期或确认失败");
      }
    } catch (Exception e) {
      e.printStackTrace();
      return Result.error("2006", "确认登录失败");
    }
  }
}
